import os
import yaml
from run import run_tests

class PyAllureAPI:
    """PyAllure API接口类，提供给Django后端调用"""
    
    @staticmethod
    def run_tests():
        """
        运行测试并生成报告
        """

        return run_tests()
    
    @staticmethod
    def create_test_yaml(case_data, file_name=None):
        """
        创建测试用例YAML文件
        
        Args:
            case_data: 测试用例数据
            file_name: 文件名，如不提供则使用title作为文件名
            
        Returns:
            str: 生成的文件路径
        """
        # 确定测试用例目录
        current_dir = os.path.dirname(os.path.abspath(__file__))
        testcases_dir = os.path.join(current_dir, 'testcases')
        os.makedirs(testcases_dir, exist_ok=True)
        
        # 确定文件名
        if not file_name:
            file_name = f"test_{case_data.get('title', 'test')}.yaml"
        
        # 确保文件名以.yaml结尾
        if not file_name.endswith('.yaml'):
            file_name += '.yaml'
        
        # 完整文件路径
        file_path = os.path.join(testcases_dir, file_name)
        
        # 写入YAML文件
        with open(file_path, 'w', encoding='utf-8') as f:
            yaml.dump(case_data, f, allow_unicode=True)
        
        return file_path
    
    @staticmethod
    def convert_django_case(case):
        """
        将Django模型的用例转换为PyAllure需要的YAML格式
        
        Args:
            case: Django模型的用例对象
            
        Returns:
            dict: 转换后的用例数据
        """
        # 基本信息
        case_data = {
            'title': case.name,
            'request': {
                'method': case.interface.method,
                'url': case.interface.url,
            }
        }
        
        # 添加Allure标注
        if case.allure:
            if 'feature' in case.allure:
                case_data['feature'] = case.allure['feature']
            if 'story' in case.allure:
                case_data['story'] = case.allure['story']
        
        # 添加API参数
        if case.api_args:
            for key, value in case.api_args.items():
                case_data['request'][key] = value
        
        # 添加提取规则
        if case.extract:
            case_data['extract'] = case.extract
        
        # 添加断言规则 - 直接使用用户定义的格式
        if case.validate:
            case_data['validate'] = case.validate
        
        return case_data
    
    @staticmethod
    def clean_testcases_dir():
        """
        清理testcases目录中的所有YAML文件
        """
        current_dir = os.path.dirname(os.path.abspath(__file__))
        testcases_dir = os.path.join(current_dir, 'testcases')
        
        if os.path.exists(testcases_dir):
            for file in os.listdir(testcases_dir):
                if file.endswith('.yaml'):
                    try:
                        os.remove(os.path.join(testcases_dir, file))
                    except:
                        pass 